首先從生成模式開始,第一種生成模式是 abstract factory (抽象工廠)
抽象工廠的目的是要讓同一個介面來建立一整族相關or相依賴的物件,並且在過程中不需明確的定義各個物件具象化的類別。
換句話說,若我要使用abstract factory模式,我可以在一個abstract factory類別裡面定義了好幾個介面,這些介面可能分別會產生類別A及類別B的物件,但不論是什麼類別,介面之間生成的物件彼此有關聯,或是互相依賴。
而這個介面我可以繼續沿用,拿來繼承並衍生新的類別,新的類別裡面會生產類別C跟類別D的物件,CD之間彼此關聯或互相依賴。但總之他們都是共用abstract factory最初的parent class定義的介面。
這裡我想了一個手機工廠的例子
一台手機的製造,需要螢幕、電池、記憶體、邊框、鏡頭、晶片組、天線、連接線等等的材料
所以可以知道製作一台手機就是需要那些東西
這邊把它拿來定義成一個抽象工廠類
意思是我完全不知道要買哪一家廠牌的材料來組成一台手機
但我就是知道手機需要那些材料!
using namespace std;
class abstractSmartphoneFactory {
public:
virtual display* getDisplay() = 0;
virtual battery* getBattery() = 0;
virtual memory* getMemory() = 0;
virtual frame* getFrame() = 0;
virtual camera* getCamera() = 0;
virtual chipset* getChipset() = 0;
virtual antenna* getAntenna() = 0;
virtual connector* getConnector() = 0;
virtual operatingSystem* getOs() = 0;
};
有了上面的物料清單(bill of material)
現在任何一家想進來手機市場分一杯羹的,都可以照這個工廠模板生產屬於自己的手機!
只是需要實際的採買上述的原料(也就是實作)
今天三星決定加入戰局,要開始做手機
於是把這個工廠拿來直接套用,蓋了一間自己的手機生產工廠
class samsungFactory() : public abstractSmartphoneFactory {
public:
display* getDisplay() override { cout << "samsung amoled"; }
chipset* getChipset() override { cout << "qualcomm snapdragon"; }
operatingSystem* getOs() override { cout << "android"; }
/* 其他忽略,假設都有override所有pure virtual function */
};
那麼,當三星蓋好了工廠,他就可以生產手機了
class samsungCompany(){
public:
smartPhone* createSmartPhone(abstractSmartphoneFactory* factory){
display* d = factory->getDisplay();
chipset* c = factory->getChipset();
operatingSystem* os = factory->getOs();
}
}
int main(){
samsungCompany* company = new SamsungCompany;
abstractSmartphoneFactory* factory = new samsungFactory;
company.createSmartPhone(factory);
return 0;
}
若今天蘋果也要來做手機...
他可以拿 abstractSmartphoneFactory 去繼承
實作出 A series 晶片組、實作出自己的 display、還有apple專屬的iOS
熱騰騰的蘋果手機工廠就會誕生啦!
以上就是abstract factory的簡單介紹
直接拿真的工廠來舉例,不知道好不好
不過先不管了,抽象工廠模式就是工廠阿!最一開始的abstract class就是要負責打嘴砲,夠抽象了吧